package thinkingInJava.String_;

public class StringIntern {
    static void Intern1(){
        String str1 = "a";		// "a" 加入池中   
        String str2 = "bc";   	// "bc" 加入池中
        String str3 = "a"+"bc";	// "abc" 加入池中
        String str4 = str1+str2;   
        
        System.out.println(str3);
        System.out.println(str4);
        System.out.println(str3.equals(str4));	// true 这个对比的是字符内容是否相同
        System.out.println(str3==str4);			// false 这个对比的是否是同一对象,也可以认为对比的是对象地址
        // http://txy821.iteye.com/blog/760957
        // 由于池中已经存在一个字符常量 "abc" (str3初始化时加的),用 intern 就不会再 new 一个新对象,因此此操作相当于 str4 = str3;
        // 要注意, intern 中的池只存在字符串常量
        str4 = (str1+str2).intern();
        System.out.println(str3==str4);			// true 两个是同一个对象,对比的是对象地址
    }
    
//    只有使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对
//    象才会被加入字符串池中。对于所有包含new方式新建对象（包括null）的“+”连接表达式，它所产生的新对
//    象都不会被加入字符串池中，对此我们不再赘述
    static void Intern2(){
        String a = "ab";// 创建了一个对象，并加入字符串池中
        System.out.println("String a = \"ab\";");
        String b = "cd";// 创建了一个对象，并加入字符串池中
        System.out.println("String b = \"cd\";");
        String c = "abcd";// 创建了一个对象，并加入字符串池中
        String d = "ab" + "cd";
        // 如果d和c指向了同一个对象，则说明d也被加入了字符串池
        if (d == c) {
            System.out.println("\"ab\"+\"cd\" 创建的对象 \"加入了\" 字符串池中");
        }
        // 如果d和c没有指向了同一个对象，则说明d没有被加入字符串池
        else {
            System.out.println("\"ab\"+\"cd\" 创建的对象 \"没加入\" 字符串池中");
        }
        String e = a + "cd";
        // 如果e和c指向了同一个对象，则说明e也被加入了字符串池
        if (e == c) {
            System.out.println(" a +\"cd\" 创建的对象 \"加入了\" 字符串池中");
        }
        // 如果e和c没有指向了同一个对象，则说明e没有被加入字符串池
        else {
            System.out.println(" a +\"cd\" 创建的对象 \"没加入\" 字符串池中");
        }
        String f = "ab" + b;
        // 如果f和c指向了同一个对象，则说明f也被加入了字符串池
        if (f == c) {
            System.out.println("\"ab\"+ b 创建的对象 \"加入了\" 字符串池中");
        }
        // 如果f和c没有指向了同一个对象，则说明f没有被加入字符串池
        else {
            System.out.println("\"ab\"+ b 创建的对象 \"没加入\" 字符串池中");
        }
        String g = a + b;
        // 如果g和c指向了同一个对象，则说明g也被加入了字符串池
        if (g == c) {
            System.out.println(" a + b 创建的对象 \"加入了\" 字符串池中");
        }
        // 如果g和c没有指向了同一个对象，则说明g没有被加入字符串池
        else {
            System.out.println(" a + b 创建的对象 \"没加入\" 字符串池中");
        }
    }
    
    public static void main(String[] args) {
        Intern1();
        Intern2();
    }
}
